package com.billdowney.util.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.billdowney.util.CommonUtil;

/**
 * @ClassName: ValidationUtil
 * @Description: 通用验证工具类
 * @author 超级小富翁 - BillDowney
 * @date 2018年1月8日 下午10:12:30
 */
public class ValidationUtil {

	/**
	 * @Function: validationRegExp
	 * @Description: 验证正则表达式和对象
	 * @param pattern 正则表达式
	 * @param str     验证的字符串对象
	 * @return 是否匹配
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:23:25
	 */
	private static boolean validationRegExp(String pattern, CharSequence str) {
		// 忽略大小写的写法
		// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
		if (CommonUtil.isEmpty(str)) {
			return false;
		}
		Matcher matcher = Pattern.compile(pattern).matcher(str);
		// 字符串是否与正则表达式相匹配
		return matcher.matches();
	}

	/**
	 * @Function: patternAndObject
	 * @Description: 自定义传入表达式和对象验证
	 * @param pattern 正则表达式
	 * @param str     验证的字符串对象
	 * @return 是否匹配
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:26:30
	 */
	public static boolean patternAndObject(String pattern, CharSequence str) {
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: integer
	 * @Description: 整数
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:29:46
	 */
	public static boolean integer(CharSequence str) {
		String pattern = "^-?\\d+$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: positiveInteger
	 * @Description: 正整数，不包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:34:50
	 */
	public static boolean positiveInteger(CharSequence str) {
		String pattern = "^\\+?[1-9][0-9]*$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: negativeInteger
	 * @Description: 负整数，不包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:35:53
	 */
	public static boolean negativeInteger(CharSequence str) {
		String pattern = "^\\-[1-9][0-9]*$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: notPositiveInteger
	 * @Description: 非正整数，包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:38:18
	 */
	public static boolean notPositiveInteger(CharSequence str) {
		String pattern = "^((-\\d+)|(0+))$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: notNegativeInteger
	 * @Description: 非负整数，包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:39:21
	 */
	public static boolean notNegativeInteger(CharSequence str) {
		String pattern = "^\\d+$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: floatNumber
	 * @Description: 浮点数
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:42:10
	 */
	public static boolean floatNumber(CharSequence str) {
		String pattern = "^(-?\\d+)(\\.\\d+)?$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: positiveFloat
	 * @Description: 正浮点数，不包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:42:53
	 */
	public static boolean positiveFloat(CharSequence str) {
		String pattern = "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: negativeFloat
	 * @Description: 负浮点数，不包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:43:46
	 */
	public static boolean negativeFloat(CharSequence str) {
		String pattern = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: notPositiveFloat
	 * @Description: 非正浮点数，包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:44:24
	 */
	public static boolean notPositiveFloat(CharSequence str) {
		String pattern = "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: notNegativeFloat
	 * @Description: 非负浮点数，包含0
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:45:28
	 */
	public static boolean notNegativeFloat(CharSequence str) {
		String pattern = "^\\d+(\\.\\d+)?$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: email
	 * @Description: Email地址
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:46:08
	 */
	public static boolean email(CharSequence str) {
		String pattern = "^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: fixedTelephone
	 * @Description: 固定电话，正确格式为：XXXX-XXXXXXX，XXXX-XXXXXXXX，XXX-XXXXXXX，XXX-
	 *               XXXXXXXX，XXXXXXX，XXXXXXXX
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:47:02
	 */
	public static boolean fixedTelephone(CharSequence str) {
		String pattern = "^(\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: mobileTelephone
	 * @Description: 移动电话，1开头的11位数字
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:47:37
	 */
	public static boolean mobileTelephone(CharSequence str) {
		String pattern = "^1[0-9]{10}$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: chinese
	 * @Description: 是否含有中文字符，包括中文标点符号
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:48:23
	 */
	public static boolean chinese(CharSequence str) {
		String pattern = "[^\\x00-\\xff]*";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: lengthScope
	 * @Description: 长度范围，max：最大长度，min：最小长度
	 * @param str
	 * @param max 最大长度
	 * @param min 最小长度
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:49:43
	 */
	public static boolean lengthScope(CharSequence str, int max, int min) {
		String pattern = "^\\S{" + min + "," + max + "}$";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: idCard
	 * @Description: 身份证号码，身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年1月8日 下午10:50:40
	 */
	public static boolean idCard(CharSequence str) {
		String pattern = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)";
		return validationRegExp(pattern, str);
	}

	/**
	 * @Function: noSpecialChar
	 * @Description: 非特殊字符，只能包括数字、小写字母和大写字母，并且不能为空
	 * @param str
	 * @return
	 * @author: 超级小富翁 - BillDowney
	 * @date: 2018年3月21日 下午6:14:30
	 */
	public static boolean noSpecialChar(CharSequence str) {
		String pattern = "^[0-9a-zA-Z]+$";
		return validationRegExp(pattern, str);
	}
}
